// 主程序文件（建议命名为 main.c）
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 包含所有核心模块的头文件（确保结构体和函数声明可见）
#include "All_struct.h"
#include "Restaurant.h"
#include "Window.h"
#include "Dish.h"

// 定义数据文件路径（当前目录下，文件名：restaurant_data.bin）
#define DATA_FILE_PATH "restaurant_data.bin"

// -------------------------- 工具函数（辅助输入处理） --------------------------
// 清除输入缓冲区残留的换行符
void clear_buf() {
    while (getchar() != '\n');
}

// 读取整数（处理非法输入，确保输入有效）
int read_int(const char *prompt) {
    int num;
    printf("%s", prompt);
    while (scanf("%d", &num) != 1) {
        clear_buf();
        printf("输入错误！请输入整数：");
    }
    clear_buf(); // 清除输入后的换行符
    return num;
}

// 新增：退出前自动保存数据
void auto_save_before_exit(Restaurant *pR) {
    printf("\n正在自动保存数据...\n");
    save_restaurant(pR, DATA_FILE_PATH);
    printf("数据已自动保存，退出程序！\n");
}

// -------------------------- 窗口操作子界面（二级菜单） --------------------------
// 进入指定窗口的操作界面（修正：Dish系列函数传窗口指针pWin，而非餐馆指针pR）
void window_operate_ui(Window *pWin, Restaurant *pR) {
    if (pWin == NULL) return;
    int choice;

    do {
        // 窗口操作菜单（保持原格式，修正函数调用参数）
        printf("\n=================== 【%s（窗口%d）操作】 ===================\n", 
               pWin->window_name, pWin->window_id);
        printf("1. 添加菜品          2. 删除菜品          3. 修改菜品\n");
        printf("4. 查找菜品          5. 查看窗口订单      6. 新增订单\n");
        printf("7. 库存预警          8. 计算窗口营业额    9. 返回上一级\n");
        choice = read_int("请选择操作（1-9）：");

        switch (choice) {
            // 修正1：Dish系列函数传当前窗口pWin（菜品属于窗口，非餐馆）
            case 1: Dish_add(pWin); break;          // 原传pR → 改传pWin
            case 2: Dish_delete(pWin); break;       // 原传pR → 改传pWin
            case 3: Dish_update(pWin); break;       // 原传pR → 改传pWin
            case 4: Dish_find(pWin); break;         // 原传pR → 改传pWin

            case 5: { // 查看当前窗口订单（逻辑不变，正常调用）
                if (pWin->order_count == 0) {
                    printf("当前窗口暂无订单！\n");
                    break;
                }
                printf("\n【%s订单列表】\n", pWin->window_name);
                for (int i = 0; i < pWin->order_count; i++) {
                    Dish *order = &pWin->Orders[i];
                    printf("订单%d：%s（%d份） - 单价%.2f元\n", 
                           i+1, order->name, order->stock, order->price);
                }
                break;
            }

            // 修正2：统一订单函数名（原Window_Order → 改为你实现的Window_Order_add）
            case 6: Window_Order_add(pWin); break;  // 匹配你补全的订单新增函数

            case 7: { // 库存预警（逻辑不变，参数正确）
                int threshold = read_int("请输入库存预警阈值：");
                int warn_count = Window_stock_warning(pWin, threshold);
                printf("库存低于%d的菜品共%d道（需补货）\n", threshold, warn_count);
                break;
            }

            case 8: { // 计算营业额（逻辑不变，参数正确）
                float revenue = Window_calc_revenue(pWin);
                printf("当前窗口营业额：%.2f元\n", revenue);
                break;
            }

            case 9: 
                printf("返回餐馆主界面...\n");
                break;

            default: 
                printf("无效选择！请重新输入\n");
        }
    } while (choice != 9);
}

// -------------------------- 窗口管理子界面（新增：处理窗口增删改查） --------------------------
// 餐馆主界面的“窗口管理”入口（包含添加/删除/更新/查找窗口）
void window_manager_ui(Restaurant *pR) {
    if (pR == NULL) return;
    int choice;

    do {
        printf("\n=================== 【窗口管理】 ===================\n");
        printf("1. 添加窗口          2. 删除窗口          3. 更新窗口信息\n");
        printf("4. 查找窗口          5. 进入窗口操作      6. 返回上一级\n");
        choice = read_int("请选择操作（1-6）：");

        switch (choice) {
            // 调用你实现的Window系列函数（参数均为pR，符合函数声明）
            case 1: Window_add(pR); break;         // 新增窗口
            case 2: Window_delete(pR); break;      // 删除窗口
            case 3: Window_update(pR); break;      // 更新窗口
            case 4: Window_find(pR); break;        // 查找窗口

            case 5: { // 进入指定窗口的操作界面（原逻辑迁移至此）
                if (pR->window_count == 0) {
                    printf("当前餐馆暂无窗口！请先添加窗口\n");
                    break;
                }
                int target_id = read_int("请输入要操作的窗口编号：");
                Window *target_win = NULL;
                for (int i = 0; i < pR->window_count; i++) {
                    if (pR->windows[i].window_id == target_id) {
                        target_win = &pR->windows[i];
                        break;
                    }
                }
                if (target_win == NULL) {
                    printf("未找到编号为%d的窗口！\n", target_id);
                } else {
                    window_operate_ui(target_win, pR); // 进入窗口二级界面
                }
                break;
            }

            case 6: 
                printf("返回餐馆主界面...\n");
                break;

            default: 
                printf("无效选择！请重新输入\n");
        }
    } while (choice != 6);
}

// -------------------------- 餐馆主操作界面（一级菜单：整合所有功能入口） --------------------------
void restaurant_main_ui(Restaurant *pR) {
    if (pR == NULL) return;
    int choice;
    Restaurant_init(pR); // 初始化餐馆（默认名称：暂未命名）
    // 程序启动时自动加载数据（优先读文件，无文件则初始化）
    load_restaurant(pR, DATA_FILE_PATH);
    
    do {
        // 主菜单：新增“添加窗口”入口，整合所有模块功能
        printf("\n=================== 【%s 管理系统】 ===================\n", 
               pR->restaurant_name);
        // 主菜单新增“6. 手动保存数据”
        printf("1. 修改餐馆名称      2. 查看餐馆概览      3. 窗口管理\n");
        printf("4. 批量设置窗口状态  5. 统计总菜品数      6. 手动保存数据\n");
        printf("7. 计算餐馆总营收    8. 退出系统\n");
        choice = read_int("请选择操作（1-8）：");

        switch (choice) {
            case 1: { // 修改餐馆名称（逻辑不变）
                char new_name[50];
                printf("请输入新的餐馆名称：");
                fgets(new_name, 50, stdin);
                new_name[strcspn(new_name, "\n")] = '\0'; // 去除换行符
                Restaurant_set_name(pR, new_name);
                printf("餐馆名称已修改为：%s\n", pR->restaurant_name);
                break;
            }

            case 2: // 查看餐馆概览（调用你实现的函数）
                Restaurant_show_overview(pR);
                break;

            case 3: // 窗口管理（进入新增的窗口管理子界面）
                window_manager_ui(pR);
                break;

            case 4: { // 批量设置窗口状态（调用你实现的函数）
                int state = read_int("请输入要设置的状态（1=营业，0=打烊）：");
                if (state != 1 && state != 0) {
                    printf("状态错误！仅支持1（营业）或0（打烊）\n");
                    break;
                }
                Restaurant_batch_set_window_status(pR, state);
                break;
            }

            case 5: { // 统计总菜品数（调用你实现的函数）
                Restaurant_calc_total_dishes(pR); // 函数内部已打印结果
                break;
            }

	    case 6:
                save_restaurant(pR, DATA_FILE_PATH);
                break;
                
            case 7: { // 新增：计算餐馆总营收（调用你实现的函数）
                Restaurant_Window_calc_revenue(pR); // 函数内部已打印结果
                break;
            }

            case 8: 
                // 退出前自动保存数据
                auto_save_before_exit(pR);
                printf("退出系统成功！\n");
                break;

            default: 
                printf("无效选择！请重新输入\n");
        }
    } while (choice != 8);
}

// -------------------------- 主函数（程序入口：链接所有模块） --------------------------
int main() {
    Restaurant my_restaurant; // 定义餐馆结构体变量
    restaurant_main_ui(&my_restaurant); // 启动主界面，传餐馆地址
    return 0;
}